import axios from 'axios'
import { ElLoading, ElMessage } from 'element-plus'
import { getToken } from '_utils/user'
import router from '@/router'
// 配置 baseURL 以及超时时间等
const request = axios.create({
  /*
    开发时 baseURL一般为 /api 反向代理 请求前缀
    上线后：
      线上服务器源+/api 一般 上线后 前端代码和后端接口代码部署同一个源下
    怎么解决 axios 请求 基础源 开发和生产不一致问题
  */
  baseURL: process.env.VUE_APP_BASEAPI
})
let loadingInstance = null
// 添加请求和响应拦截
request.interceptors.request.use(function (config) {
  // 请求头添加token 做接口 token校验
  if (getToken()) {
    config.headers.token = getToken()
  }
  loadingInstance = ElLoading.service({
    fullscreen: true,
    text: '加载中...',
    lock: true,
    background: 'rgba(0, 0, 0, 0.7)'
  })
  return config
}, function (error) {
  loadingInstance.close()
  return Promise.reject(error)
})

request.interceptors.response.use(function (res) {
  // 判断后端返回 code码 做 登录过期 未登录处理
  switch (res.data.code) {
    case 401: // token过期
      ElMessage({
        type: 'error',
        message: '登录状态过期',
        duration: 2000,
        onClose: () => {
          // 清除缓存 然后去登录页
          localStorage.removeItem('token')
          localStorage.removeItem('user')
          // 如何在非组件js文件中 跳转路由
          router.replace('/login')
        }
      })
      break
    case 403: // token过期
      ElMessage({
        type: 'error',
        message: '用户未登录',
        duration: 2000,
        onClose: () => {
          // 然后去登录页
          router.replace('/login')
        }
      })
      break
  }
  loadingInstance.close()
  return res
}, function (error) {
  loadingInstance.close()
  return Promise.reject(error)
})

export default request
